package com.huluobo.lib_base

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import okhttp3.OkHttpClient
import okhttp3.Request
import java.io.File

/**
 *  Created by LC on 2025/3/26.
 */
object DownloadUtils {
    fun download(url: String, file: File): Flow<UIState> {
        return flow {
            //构建一个url的请求
            val request = Request.Builder().url(url).get().build()
            //通过请求返回数据,执行了上面的url请求,并且返回数据
            val response = OkHttpClient.Builder().build().newCall(request).execute()
            //判断请求是否成功
            if (response.isSuccessful) {
                //如果成功
                response.body.let { body ->
                    file.outputStream().let { os ->
                        //从body中取出字节流,下载的内容
                        val bs = body?.byteStream()
                        //默认的文件或者字节长度
                        var len = 0
                        //声明字节数组,默认DEFAULT_BUFFER_SIZE 缓冲区的大小,这里是默认大小
                        val byteArray = ByteArray(DEFAULT_BUFFER_SIZE)
                        //also { len = it!! } 将读取到字节数赋值给len
                        //while循环判断字节数不等于-1
                        while (bs?.read(byteArray).also { len = it!! } != -1) {
                            //把下载的字节数组,写入到文件中(通过outputStream写入)
                            os.write(byteArray, 0, len)
                        }
                        //写入完毕不再进入循环的时候,刷新输入流,确保将所有缓冲区的数据都被写入目标
                        os.flush()
                        //关闭输入流,到此为止已经形成了一个文件
                        os.close()
                        //发送成功的状态
                        emit(UIState.OnSuccess("下载完成", type = HttpType.DOWNLOAD))
                    }
                }
            } else {
                //发送失败的状态
                emit(UIState.OnError("下载失败"))
            }
        }
    }
}